package com.example.innerclass3;

/**
 * 演示局部内部类的使用
 */
public class LocalInnerClass {//外部其他类

    public static void main(String[] args) {
        /*
        结论
        局部内部类的使用
        说明：
        1.局部内部类是定义在外部类的局部位置，比如方法中，并且有类名。
        2.可以直接访问外部类的所有成员，包含私有的
        3.不能添加访问修饰符，因为它的地位就是一个局部变量。局部变量是不能使用修饰符的。但是可以使用final修饰，因为局部变量也可以使用final
        4.作用域：仅仅在定义它的方法或代码块中。
        5.局部内部类---访问---->外部类的成员[访问方式：直接访问]
        6.外部类---访问---->局部内部类的成员 ;
        访问方式：创建对象，再访问（注意：必须在作用域内）
        记住：
        （1）局部内部类定义在方法中/代码块
        （2）作用域在方法体或者代码块中
        （3）本质仍然是一个类

        7.外部其他类---不能访问----->局部内部类(因为 局部内部类地位是一个局部变量)
        8.如果外部类和局部内部类的成员重名时，默认遵循就近原则，如果想访问外部类的成员，则可以使用（外部类名.this.成员)去访问
        System.out.println("外部类的n2=”+外部类名.this.n2);
         */


        //7.外部其他类---不能访问----->局部内部类(因为 局部内部类地位是一个局部变量)
        //我们的LocalInnerClass就是一个外部其他类，外部其他类来访问局部内部类，是不能访问的

        outer02 outer02 = new outer02();
        outer02.m1();

    }
}

class outer02 {
    //私有属性
    private int n1 = 100;
    private int a = 0;

    //私有方法
    private void m2() {
        System.out.println("Outer02 m2()");
    }

    public void m1() {
        //1.局部内部类是定义在外部类的局部位置，比如方法中，并且有类名。
        //  这就是一个局部内部类，定义在方法中，也可以定义在代码块中 类名是Inner02，定义在方法中
        //3.不能添加访问修饰符，因为它的地位就是一个局部变量。局部变量是不能使用修饰符的。但是可以使用final修饰，因为局部变量也可以使用final
        //注意不可以使用访问修饰符去修饰局部类，只能使用final 注意使用final修饰后的类还是可以被实例化的，如果是abstract那么就是一个抽象类就不能被实例化不要搞混了
        //4.作用域：仅仅在定义它的方法或代码块中。
        final class Inner02 {//局部内部类
            private int n1 = 800;

            public void hi() {
                //2.局部内部类可以直接访问外部类的所有成员，包含私有的
                //直接访问外部类的私有属性和私有方法
                System.out.println(n1);
                m2();

                //5.局部内部类---访问---->外部类的成员[访问方式：直接访问]
                System.out.println(a);

                //8.如果外部类和局部内部类的成员重名时，默认遵循就近原则，如果想访问外部类的成员，则可以使用（外部类名.this.成员)去访问
                //此时我们的Inner02类(也就是局部内部类)中有一个私有的n1属性，在外部类中也有一个n1s属性，因为默认遵守就近原则，所以当我们直接去输出n1的时候，访问到的是内部类中的值
                //如果想访问外部类中的值，使用外部类名.this.属性名去访问
                //看演示
                //outer02.this 本质就是外部类的对象
                System.out.println(outer02.this.n1);//这里输出的就是外部类的n1
                System.out.println(n1);//因为默认遵守就近原则，所以访问到的就是内部类中的n1
                System.out.println(Inner02.this.n1);//这样访问的也是内部类中的n1
            }
        }
        //6.外部类---访问---->局部内部类的成员 ;
        //访问方式：创建对象，再访问（注意：必须在作用域内） 因为他的作用域是在定义他的方法或者代码块中
        //记住：
        //（1）局部内部类定义在方法中/代码块
        //（2）作用域在方法体或者代码块中
        //（3）本质仍然是一个类
        //注意此时这段代码的范围是在m1()方法中的，外部类也可以直接访问内部类的私有属性
        Inner02 inner02 = new Inner02();
        System.out.println(inner02.n1);

    }
}


